package controller;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.StyledEditorKit.ForegroundAction;

import controller.TreePanelController.TreeListener;

import view.ZeigeLieferungenPanel;
import view.StartMainPanel;

import model.Buchung;
import model.Hauptlagerliste;
import model.Lagerliste;
import model.Materiallagerliste;
import model.Zulieferung;
import model.Lager;
import model.Lieferungsliste;
import model.Zwischenlagerliste;

public class LieferungenController {

	private SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");

	private final String fnLag = ".\\Daten\\Buchungen.txt";
	// private List<Zulieferung> buchungen = new ArrayList<Zulieferung>();
	private Lieferungsliste lieferungsliste = Lieferungsliste
			.getDieLieferungsliste();
	private Hauptlagerliste hauptlagerliste = Hauptlagerliste
			.getDieHauptlagerliste();
	private Object[][] buchungsDaten;
	private ZeigeLieferungenPanel lieferungenPanel;
	private TableListener tL;

	public LieferungenController() {
		tL = new TableListener();
		loadBuchungen(fnLag);
		buLi2BuAr();
		erstellBuchungenPanel();
		listenerAnmelden();

	}

	private void loadBuchungen(String fnLag) {

		File file = new File(fnLag);
		Materiallagerliste materiallagerliste = Materiallagerliste
				.getDieMateriallagerliste();
		try {
			Scanner datei = new Scanner(file);
			while (datei.hasNextLine()) {
				try {
					Zulieferung b = new Zulieferung();
					String datenSatz = datei.nextLine();
					Scanner sc = new Scanner(datenSatz).useDelimiter(";");

					try {
						b.setDatum(sdf.parse(sc.next()));
					} catch (ParseException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					int gesamtMenge = sc.nextInt();
					b.setAnzahl(gesamtMenge);
					while (sc.hasNext()) {
						Buchung e = new Buchung();

						int lagerId = sc.nextInt();
						int anteil = sc.nextInt();

						for (Lager lager : materiallagerliste) {
							if (lager.getId() == lagerId) {
								int menge = (int) ((anteil / 100.0) * gesamtMenge);
								lager.aendereBestand((int) menge);

							}
						}

						e.setLagId(lagerId);
						e.setAnteil(anteil);
						b.getBuchungen().add(e);
					}
					lieferungsliste.getZulieferungsliste().add(b);
					// buchungen.add(b);

				} catch (NumberFormatException e) {
					e.printStackTrace();
				}
			}
		} catch (FileNotFoundException e) {
		}

	}

	public void listenerAnmelden() {
		lieferungenPanel.getTabelle().getSelectionModel()
				.addListSelectionListener(tL);
	}

	public void listenerAbmelden() {
		lieferungenPanel.getTabelle().getSelectionModel()
				.removeListSelectionListener(tL);
	}

	public ZeigeLieferungenPanel getGesBuchungPanel() {
		return lieferungenPanel;
	}

	public void setGesBuchungPanel(ZeigeLieferungenPanel gesBuchungPanel) {
		this.lieferungenPanel = gesBuchungPanel;
	}

	private void buLi2BuAr() {

		buchungsDaten = new Object[lieferungsliste.getZulieferungsliste()
				.size()][2];
		for (int i = 0; i < lieferungsliste.getZulieferungsliste().size(); i++) {
			buchungsDaten[i][0] = lieferungsliste.getZulieferungsliste().get(i)
					.getDatum();
			buchungsDaten[i][1] = lieferungsliste.getZulieferungsliste().get(i)
					.getAnzahl();
		}
	}

	private void erstellBuchungenPanel() {
		String[] spalten = { "Datum - Uhrzeit", "Anzahl" };
		lieferungenPanel = new ZeigeLieferungenPanel(buchungsDaten, spalten,
				lieferungsliste);

	}

	public class TableListener implements ListSelectionListener {
		String detailAusgabe;

		@Override
		public void valueChanged(ListSelectionEvent arg0) {

			SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");

			// Alle Informationen bekommen
			int index = lieferungenPanel.getTabelle().getSelectionModel()
					.getAnchorSelectionIndex();
			int anzahl = lieferungsliste.getZulieferungsliste().get(index)
					.getAnzahl();
			Date datum = lieferungsliste.getZulieferungsliste().get(index)
					.getDatum();
			List<Buchung> einzelBuchung = lieferungsliste
					.getZulieferungsliste().get(index).getBuchungen();

			String ausgabe = "Datum - Uhrzeit: " + sdf.format(datum) + "\n"
					+ "Gesamtmenge: " + anzahl + "\n\n" + "Details: \n";

			for (Buchung einzBuchung : einzelBuchung) {
				String lagerbezeichnung = "Unbekannt";
				Materiallagerliste materiallagerliste = Materiallagerliste
						.getDieMateriallagerliste();
				for (Lager lager : materiallagerliste) {
					if (lager.getId() == einzBuchung.getLagId()) {
						lagerbezeichnung = lager.getName();
					}
				}
				ausgabe = ausgabe.concat("Lager ID: " + einzBuchung.getLagId()
						+ "\nLagerbezeichnung: " + lagerbezeichnung

						+ "\nAnteil: " + einzBuchung.getAnteil() + "%\n\n");
			}

			JOptionPane.showMessageDialog(null, ausgabe,
					"Details der Lieferung", 1);

		}

	}

	public Lieferungsliste getLieferungsliste() {
		return lieferungsliste;
	}

	public void setLieferungsliste(Lieferungsliste lieferungsliste) {
		this.lieferungsliste = lieferungsliste;
	}

}
